package scene

import (
	"clientDemo/ui/fyne_ui/common"
	"clientDemo/ui/fyne_ui/data"
	"clientDemo/ui/fyne_ui/scene/new_element"
	"clientDemo/ui/fyne_ui/scene/propert_scence"
	"clientDemo/ui/fyne_ui/scene/scene_widget"
	"clientDemo/ui/fyne_ui/scene/widget_tree"
	widget2 "clientDemo/ui/fyne_ui/widget"
	"clientDemo/ui/fyne_ui/widget/custom"
	"clientDemo/ui/fyne_ui/widget/extend_widget"
	"clientDemo/ui/fyne_ui/widget/interface"
	"fmt"
	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/driver/desktop"
	"fyne.io/fyne/v2/theme"
	"fyne.io/fyne/v2/widget"
	"github.com/ian-kent/go-log/log"
	"time"
)

var currentWidget widgetcommon.IWidgetItem
var sceneXml *widget2.SceneXmlParser

// customLayout 是一个自定义布局管理器，它将确保最后一个组件占据剩余空间
type customLayout struct{}

// MinSize 返回布局所需的最小大小
func (l *customLayout) MinSize(objects []fyne.CanvasObject) fyne.Size {
	// 计算所有对象的最小大小总和
	var width float32
	var height float32

	for _, child := range objects {
		childMin := child.MinSize()
		width = fyne.Max(width, childMin.Width)
		height += childMin.Height
	}

	return fyne.NewSize(width, height)
}

// Layout 布局所有对象
func (l *customLayout) Layout(objects []fyne.CanvasObject, containerSize fyne.Size) {
	y := float32(0)

	// 为前两个对象（menuBarWrapper和separator）设置大小和位置
	for i, child := range objects {
		if i < len(objects)-1 { // 不是最后一个对象
			childMin := child.MinSize()
			child.Resize(fyne.NewSize(containerSize.Width, childMin.Height))
			child.Move(fyne.NewPos(0, y))
			y += childMin.Height
		} else { // 最后一个对象（内容区域），占据剩余空间
			remainingHeight := containerSize.Height - y
			child.Resize(fyne.NewSize(containerSize.Width, remainingHeight))
			child.Move(fyne.NewPos(0, y))
		}
	}
}

func (m *SceneModule) MainScene(app fyne.App, isLogin bool) {
	// 创建主窗口
	m.mMainWindow = app.NewWindow("悠悠编辑器")
	// 设置主菜单
	m.setupMainMenu(app)
	m.mMainWindow.SetMaster()

	// 创建运行按钮
	m.mRunButton = scene_widget.NewRunButton()
	// 设置运行按钮的编辑模式改变回调，与菜单控制器的回调相同
	m.mRunButton.OnEditModeChanged = func(isEdit bool) {
		// 使用总接口设置编辑模式
		m.SetEditMode(isEdit)
	}

	// 创建新建按钮
	m.mNewElementButton = scene_widget.NewElementButton()
	// 设置新建按钮的点击回调
	m.mNewElementButton.SetOnTapped(func() {
		// 创建新页面
		newPage := new_element.NewNewElement(app, "添加控件", 600, 400, currentWidget, func(newWidget widgetcommon.IWidgetItem) {
			// 控件创建后的回调，刷新界面
			if m.mWidgetTree != nil {
				m.mWidgetTree.UpdateTreeItem(sceneXml.RootNode)
			}
		})
		newPage.Show()
	})

	// 设置初始编辑模式
	m.SetEditMode(true)

	canvasSize := fyne.NewSize(float32(common.LoginGUIWidth), float32(common.LoginGUIHeight))
	// 创建子窗口的内容
	createNewWindow := func(app fyne.App, mainWindow fyne.Window) fyne.Window {
		window := app.NewWindow("子窗口")
		switchBackButton := widget.NewButton("返回主窗口", func() {
			window.Close()
		})
		// 监听子窗口关闭事件
		window.SetOnClosed(func() {
			window.Close()
		})
		window.SetContent(container.NewVBox(
			widget.NewLabel("这是子窗口"),
			switchBackButton,
		))
		return window
	}
	_ = createNewWindow
	// 创建两个按钮
	//button1 := extend_widget.NewHoldableButton("按钮 1", func() {
	//	/*		newWindow := createNewWindow(app, mMainWindow)
	//			newWindow.Show()*/
	//})

	//button2 := widget.NewButton("按钮 2", func() {
	//	// 按钮2点击事件
	//})
	//button1.Move(fyne.NewPos(100, 100))
	//button1.Resize(fyne.NewSize(100, 100))
	//button2.Move(fyne.NewPos(100, 300))

	//customContainer2 := container.NewWithoutLayout(custom.NewTestWidget(canvasSize)) //container.New(layout.NewHBoxLayout(), widget2.NewTestWidget()) //
	//customContainer2.Resize(canvasSize)                                              // 设置容器最小大小
	//_ = customContainer2

	// 创建一个 MyWidget 实例
	//myWidget := custom.NewMyWidget("这是一个自定义小部件")
	testWidget := custom.NewTestWidget(canvasSize)
	_ = testWidget

	//buttonA := widget.NewButton("Button 1", func() {
	//	//myApp.SendNotification(fyne.NewNotification("Button Clicked", "You clicked Button 1!"))
	//})
	//buttonB := widget.NewButton("Button 2", func() {
	//	//myApp.SendNotification(fyne.NewNotification("Button Clicked", "You clicked Button 2!"))
	//})
	//buttonC := widget.NewButton("Button 3", func() {
	//	//myApp.SendNotification(fyne.NewNotification("Button Clicked", "You clicked Button 3!"))
	//})
	clock := widget.NewLabel("")
	m.updateTime(clock)

	go func() {
		for range time.Tick(time.Second) {
			m.updateTime(clock)
		}
	}()
	_ = clock
	//_ = buttonA
	//_ = buttonB
	//_ = buttonC
	//_ = myWidget
	//customContainer := widget2.NewBorderedContainer(clock)
	//_ = customContainer
	// 将按钮添加到自定义容器
	//customContainer.Add(button1)
	//customContainer.Add(button2)

	// 设置按钮的位置
	// 创建自定义文本
	//text := canvas.NewText("你好, Fyne1!", color.Black)
	//text.TextSize = 24
	//// 创建标签
	//label := widget.NewLabel("中国, Fyne!")
	//button := widget.NewButton("Click me!", func() {
	//	label.SetText("Button clicked!")
	//})

	// 使用 VBox 布局管理器
	//content := container.NewVBox(
	//	text,
	//	label,
	//	//	button1,
	//	button,
	//)
	//_ = content
	//_ = customContainer
	//button2.Move(fyne.NewPos(100, 300))

	emptyWidget := widget2.CreatWidgetContainerByName(widget2.Default_WidgetContainer_Name, fyne.NewSize(float32(common.LoginGUIWidth), float32(common.LoginGUIHeight)))
	currentWidget = emptyWidget.(widgetcommon.IWidgetItem)
	//emptyWidget := custom.NewEmptyWidget(fyne.NewSize(float32(common.LoginGUIWidth), float32(common.LoginGUIHeight)))
	text1 := extend_widget.NewLabel("topleft", nil, emptyWidget)
	text2 := extend_widget.NewLabel("Middle Label", nil, emptyWidget)
	text3 := extend_widget.NewLabel("bottomright", nil, emptyWidget)
	//text4 := extend_widget.NewLabel("bottomright2", nil, emptyWidget)
	//imag1 := extend_widget.NewImage("imag1", emptyWidget)
	//imag1.(widget2.IWidgetItemProperty).SetProperty("ImagicTexture", "./gui/MainScene/save.png")
	button_AA1 := extend_widget.NewHoldableButton("按钮 1", nil, emptyWidget)
	button_AA2 := widget.NewButton("按钮 2", func() {})
	_ = button_AA2
	emptyWidget.SetName("root")
	_ = widget2.NewSkinXmlParser("./skin/WidgetTemplate/WidgetSkin.xml")
	m.mCurrentXmlPath = "./skin/MainScene/MainScene.xml"
	sceneXml = widget2.NewSceneXmlParser(m.mCurrentXmlPath, emptyWidget)
	emptyWidget.AddWidgetChild(button_AA1, fyne.NewPos(100, 100))
	emptyWidget.AddWidgetChild(text1, fyne.NewPos(200, 30))
	emptyWidget.AddWidgetChild(text2, fyne.NewPos(200, 60))
	emptyWidget.AddWidgetChild(text3, fyne.NewPos(200, 90))
	//emptyWidget2 := extend_widget.NewEmptyWidgetTest("root2", emptyWidget)
	//emptyWidget2.(widgetcommon.IWidgetItem).AddWidgetChild(text4, fyne.NewPos(200, 120))
	//emptyWidget.(widgetcommon.IWidgetItem).AddWidgetContainer(emptyWidget2.(widgetcommon.IWidgetItem), fyne.NewPos(250, 250))

	m.mWidgetTree = widget_tree.NewWidgetTreeEditor("列表")
	m.mPropEditor = propert_scence.NewPropertiesEditor("属性")

	// 创建页签容器
	appTabs := container.NewAppTabs(
		m.mPropEditor.GetTabItem(),
		m.mWidgetTree.GetTabItem(),
		loadInformationTab(),
	)

	// 设置控件树的双击回调，实现跳转到属性面板
	m.mWidgetTree.SetOnNodeDoubleClicked(func(selectedWidget widgetcommon.IWidgetItem) {
		// 获取控件位置，使用类型断言
		var pos fyne.Position
		if canvasObj, ok := selectedWidget.(fyne.CanvasObject); ok {
			pos = canvasObj.Position()
		} else {
			// 如果无法获取位置，使用默认位置
			pos = fyne.NewPos(0, 0)
		}

		// 跳转到属性面板并显示选中控件的属性
		m.mPropEditor.UpdateAccordionWidgetItem(selectedWidget, pos)

		// 自动切换到属性页签
		appTabs.SelectTab(m.mPropEditor.GetTabItem())
	})

	split := container.NewHSplit(
		emptyWidget.(fyne.CanvasObject),
		appTabs,
	)
	m.mWidgetTree.UpdateTreeItem(sceneXml.RootNode)
	split.SetOffset(0.80)

	// 创建一个放置运行按钮的容器（位于菜单下方）
	menuBarHeight := float32(24) // 假设菜单高度为40像素，可以根据实际情况调整

	// 创建一个有背景和边框的容器，使其与主要内容区分开
	menuBarContainer := container.NewWithoutLayout()
	menuBarContainer.Resize(fyne.NewSize(float32(common.LoginGUIWidth), menuBarHeight))

	// 设置运行按钮大小和位置
	buttonSize := fyne.NewSize(menuBarHeight, menuBarHeight) // 按钮大小与菜单高度相同
	m.mRunButton.Resize(buttonSize)
	m.mRunButton.Move(fyne.NewPos(400, 0)) // 放置在左侧，紧贴菜单下方

	// 设置新建按钮大小和位置
	m.mNewElementButton.Resize(buttonSize)
	m.mNewElementButton.Move(fyne.NewPos(10, 0)) // 放置在运行按钮旁边

	// 将按钮添加到菜单下方容器
	menuBarContainer.AddObject(m.mRunButton)
	menuBarContainer.AddObject(m.mNewElementButton)

	// 使用Container来包装menuBarContainer，添加内边距
	menuBarWrapper := container.NewPadded(menuBarContainer)
	// 添加一个分隔线组件来明确区分两个区域
	separator := widget.NewSeparator()
	// 移除中间容器嵌套，直接创建一个自定义布局的容器
	// 这样可以确保窗口大小变化能正确传递到split组件
	mainContainer := container.New(
		&customLayout{}, // 自定义布局管理器
		menuBarWrapper,
		separator,
		container.NewPadded(split),
	)

	// 直接使用mainContainer作为窗口内容
	m.mMainWindow.SetContent(mainContainer)

	emptyWidget.SetTouchBeganCallback(m.TouchBeganCallback)
	emptyWidget.SetTouchMovedCallback(m.TouchMovedCallback)
	emptyWidget.SetTouchEndedCallback(m.TouchEndedCallback)
	//emptyWidget.SetObjects([]fyne.CanvasObject{button1, button2})
	//mMainWindow.SetContent(customContainer4)

	widget2.RegeditButtonCallBack("Button_Main", m.ButtonHome)
	// 设置主窗口内容
	//mMainWindow.SetContent(customContainer)
	// 设置窗口大小
	m.mMainWindow.Resize(canvasSize)

	// 将运行按钮添加到窗口的右上角，在菜单下方
	// 监听窗口关闭事件，确保应用程序能够正确退出
	m.mMainWindow.SetOnClosed(func() {
		// 使用场景模块的退出接口
		log.Println("窗口正在关闭，准备退出应用程序...")
		m.QuitApplication()
	})

	// 运行按钮的大小和位置已经在上方的布局中设置好了

	// 更简单的方式来处理窗口大小变化 - 直接在OnClosed前设置初始位置
	// 窗口大小变化时可能需要重新调整，但为了简单起见，我们先确保初始位置正确
	// 使用窗口的OnClosed事件来确保在窗口关闭时清理

	if !isLogin {
		m.mMainWindow.Hide()
		loginWindow := m.LoginScene(app, m.mMainWindow)
		loginWindow.Show()
	} else {
		m.mMainWindow.Show()
	}
}
func (m *SceneModule) updateTime(clock *widget.Label) {
	// Fyne的某些组件，如Label，提供了线程安全的SetText方法，允许从其他线程安全地更新文本。
	formatted := time.Now().Format("Time: 03:04:05")
	clock.SetText(formatted)

	// 也可以换一个写法
	/*	formatted2 := time.Now().Format("Time: 03:04:05")
		fyne.CurrentApp().Driver().RunOnMain(func() {
			clock.SetText(CurrentApp)
		})*/
}
func (m *SceneModule) TouchBeganCallback(event *desktop.MouseEvent, pos fyne.Position, obj widgetcommon.IWidgetItem, isContainer bool) bool {
	if !m.mIsEditMode {
		return true
	}

	log.Info("111111111111111  TouchBeganCallback:%v---began-------"+
		"%v  %v", obj.GetName(), event.AbsolutePosition, pos)
	m.mEditNode = obj
	m.mOffsetPos = fyne.NewPos(pos.X-event.Position.X, pos.Y-event.Position.Y)
	m.mOffsetPosGlobal = event.AbsolutePosition
	return true
}
func (m *SceneModule) TouchMovedCallback(event *desktop.MouseEvent, pos fyne.Position, obj widgetcommon.IWidgetItem, isContainer bool) bool {
	if !m.mIsEditMode {
		return false
	}
	if m.mEditNode == nil {
		return false
	}
	currentOffsetPos := fyne.NewPos(event.AbsolutePosition.X-m.mOffsetPosGlobal.X, event.AbsolutePosition.Y-m.mOffsetPosGlobal.Y)
	log.Info("222222222222222 TouchMovedCallback:%v---move-------"+
		"%v  %v", obj.GetName(), event.AbsolutePosition, currentOffsetPos)
	//if isContainer {
	//	m.mEditNode.(fyne.CanvasObject).Move(fyne.NewPos(m.mOffsetPos.X+currentOffsetPos.X, m.mOffsetPos.Y+currentOffsetPos.Y))
	//	obj.(fyne.CanvasObject).Refresh() // 强制刷新父容器
	//	return
	//}
	//m.mEditNode.(fyne.CanvasObject).Move(fyne.NewPos(m.mOffsetPos.X+currentOffsetPos.X, m.mOffsetPos.Y+currentOffsetPos.Y))

	// 计算新的位置
	newPos := fyne.NewPos(m.mOffsetPos.X+currentOffsetPos.X, m.mOffsetPos.Y+currentOffsetPos.Y)
	m.mEditNode.Move2(newPos)
	if m.mEditNode.GetParent() != nil {
		m.mEditNode.GetParent().(fyne.CanvasObject).Refresh() // 强制刷新父容器
	}

	// 实时更新属性面板中的位置信息
	if m.mPropEditor != nil {
		m.mPropEditor.UpdateAccordionWidgetItem(m.mEditNode, newPos)
	}
	return true
}
func (m *SceneModule) TouchEndedCallback(event *desktop.MouseEvent, pos fyne.Position, obj widgetcommon.IWidgetItem, isContainer bool) bool {
	if !m.mIsEditMode {
		return false
	}
	m.mEditNode = nil
	log.Info("33333333333333333 TouchEndedCallback:%v---end-------"+
		"%v  %v", obj.GetName(), event.AbsolutePosition, pos)

	m.mPropEditor.UpdateAccordionWidgetItem(obj, pos)
	return true
}

func (m *SceneModule) InitIcon(app fyne.App) {
	app.SetIcon(data.FyneLogo)
}
func (m *SceneModule) MakeTray(a fyne.App) {
	if desk, ok := a.(desktop.App); ok {
		h := fyne.NewMenuItem("Hello", func() {})
		h.Icon = theme.HomeIcon()
		menu := fyne.NewMenu("Hello World", h)
		h.Action = func() {
			log.Println("System tray menu tapped")
			h.Label = "Welcome"
			menu.Refresh()
		}
		desk.SetSystemTrayMenu(menu)
	}
}

// setupMainMenu 设置主菜单
func (m *SceneModule) setupMainMenu(app fyne.App) {
	// 初始化菜单控制器
	m.mMenuController = scene_widget.NewMenuController()
	// 设置菜单回调函数
	m.mMenuController.OnEditModeChanged = func(isEdit bool) {
		// 使用总接口设置编辑模式
		m.SetEditMode(isEdit)
	}

	m.mMenuController.OnSizeModeChanged = func(isSize bool) {
		m.mIsSizeMode = isSize
		fmt.Println("大小模式切换为:", isSize)
	}

	m.mMenuController.OnSaveClicked = func() {
		// 调用SaveThis方法（在implement.go中实现）
		m.SaveThis()
	}

	m.mMenuController.OnNewFileClicked = func() {
		// 使用场景模块的新建文件接口
		fmt.Println("执行新建文件逻辑")
		m.NewFile()
	}

	m.mMenuController.OnOpenFileClicked = func() {
		// 使用场景模块的打开文件接口
		fmt.Println("执行打开文件逻辑")
		m.OpenFile()
	}

	// 设置保存回调
	m.mMenuController.OnSaveThisClicked = func() {
		fmt.Println("执行保存当前文件逻辑")
		m.SaveThis()
	}

	m.mMenuController.OnSaveOtherClicked = func() {
		fmt.Println("执行另存为文件逻辑")
		m.SaveOther()
	}

	m.mMenuController.OnQuitClicked = func() {
		// 使用场景模块的退出接口
		fmt.Println("执行自定义退出逻辑")
		m.QuitApplication()
	}

	// 创建并设置主菜单
	mainMenu := m.mMenuController.CreateMainMenu(app, m.mMainWindow)
	m.mMainWindow.SetMainMenu(mainMenu)
}

// 注意：以下方法已在implement.go中实现
